/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../data_struct/head.h"
#include "../helper_objs/head.h"
#include "../settings/head.h"
#include "../config/head.h"
#include "../impl/head.h"
#include "../macro/head.h"
#include "../msg/head.h"
#include "port.h"

namespace xos_http
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static xos_box::i_str_property* port_propery_ptr = 0;
    static port::ITEM_DATA xos_item_data;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    port::port()
    {
        init_data();
    }

    port::~port()
    {}

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int port::get_xos_item_data( ITEM_DATA*& item_ptr )
    {
        int ret = 0;
        xos_item_data.set_container( mgr::container() );
        item_ptr = &xos_item_data;
        return ret;
    }

    int port::static_user_init()
    {
        int ret = 0;
        {
            port_propery_ptr = mgr::container()->box()->get_str_prop();
        }
        return ret;
    }

    int port::static_user_term()
    {
        int ret = 0;
        xos_stl::release_interface( port_propery_ptr );
        return ret;
    }

    xos_box::i_str_property* port::get()
    {
        return port_propery_ptr;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int port::init_data()
    {
        int ret = 0;

        // scan
        m_full_path = "";
        m_full_uri = "";
        m_port = "";
        m_pProp = 0;
        m_nPort = 0;

        // net
        m_pConnect = 0;
        m_pSslClientMgr = 0;
        m_pSslMgr = 0;

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    int port::load_cert()
    {
        int ret = 0;

        host * pDefaultHost = (host *)m_pProp->obj( config::get()->m_default_host.c_str() );
        path * pSslPath = (path*)pDefaultHost->m_pProp->obj( config::get()->m_ssl.c_str() );

        if( 0 == ret )
        {
            ret = helper_ssl::load_cert( m_pSslClientMgr, pSslPath->m_full_path.c_str(), false );
        }

        if( 0 == ret )
        {
            ret = helper_ssl::load_cert( m_pSslMgr, pSslPath->m_full_path.c_str(), true );
        }

        return ret;
    }

    int port::init()
    {
        int ret = 0;
        {
            m_pProp = mgr::container()->box()->get_str_prop();
        }
        return ret;
    }

    int port::term()
    {
        int ret = 0;
        xos_stl::release_interface( m_pSslClientMgr );
        xos_stl::release_interface( m_pSslMgr );
        xos_stl::release_interface( m_pProp );
        init_data();
        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

} // xos_http
